--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Discovery.py fa4d4c6716d4894aba8ebddbdeec6f8061ade577 (fa4d4c67) Text, 48.37 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787RNS
Tff7b72import T7ee787time
Tff7b72import T7ee787random
Tff7b72import T7ee787threading
Tff7b72import T7ee787ipaddress
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock
Tff7b72from T7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3msgpack
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Te6edf3NAME Tff7b72= T79c0ff0xFF
Te6edf3TRANSPORT_ID Tff7b72= T79c0ff0xFE
Te6edf3INTERFACE_TYPE Tff7b72= T79c0ff0x00
Te6edf3TRANSPORT Tff7b72= T79c0ff0x01
Te6edf3REACHABLE_ON Tff7b72= T79c0ff0x02
Te6edf3LATITUDE Tff7b72= T79c0ff0x03
Te6edf3LONGITUDE Tff7b72= T79c0ff0x04
Te6edf3HEIGHT Tff7b72= T79c0ff0x05
Te6edf3PORT Tff7b72= T79c0ff0x06
Te6edf3IFAC_NETNAME Tff7b72= T79c0ff0x07
Te6edf3IFAC_NETKEY Tff7b72= T79c0ff0x08
Te6edf3FREQUENCY Tff7b72= T79c0ff0x09
Te6edf3BANDWIDTH Tff7b72= T79c0ff0x0A
Te6edf3SPREADINGFACTOR Tff7b72= T79c0ff0x0B
Te6edf3CODINGRATE Tff7b72= T79c0ff0x0C
Te6edf3MODULATION Tff7b72= T79c0ff0x0D
Te6edf3CHANNEL Tff7b72= T79c0ff0x0E
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"
Tff7b72class T56d364InterfaceAnnouncerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff60
Te6edf3DEFAULT_STAMP_VALUE Tff7b72= T79c0ff14
Te6edf3WORKBLOCK_EXPAND_ROUNDS Tff7b72= T79c0ff20
Te6edf3DISCOVERABLE_INTERFACE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4]
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffLXMFTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72from T7ee787LXMF Tff7b72import Te6edf3LXStamper
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUsing on-network interface discovery requires the LXMF module to be installed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can install it with the command: pip install lxmfTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffJOB_INTERVAL
Tff7b72selfTff7b72.Td2a8ffstamper Tff7b72= Te6edf3LXStamper
Tff7b72selfTff7b72.Td2a8ffstamp_cache Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffnetwork_identity
Tff7b72elseTb4b4b4: Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffidentity
Tff7b72selfTff7b72.Td2a8ffdiscovery_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72def Td2a8ffjobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3due_interfaces Tff7b72= Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinterfaces Tff7b72if Te6edf3iTff7b72.Td2a8ffsupports_discovery Tff7b72and Te6edf3iTff7b72.Td2a8ffdiscoverable Tff7b72and Te6edf3now Tff7b72> Tb4b4b4(Te6edf3iTff7b72.Td2a8fflast_discovery_announceTff7b72+Te6edf3iTff7b72.Td2a8ffdiscovery_announce_intervalTb4b4b4)Tb4b4b4]
Te6edf3due_interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3iTb4b4b4: Te6edf3nowTff7b72-Te6edf3iTff7b72.Td2a8fflast_discovery_announceTb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3due_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3selected_interface Tff7b72= Te6edf3due_interfacesTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3selected_interfaceTff7b72.Td2a8fflast_discovery_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPreparing interface discovery announce for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3app_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_interface_announce_dataTb4b4b4(Te6edf3selected_interfaceTb4b4b4)
Tff7b72if Tff7b72not Te6edf3app_dataTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not generate interface discovery announce data for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending interface discovery announce for Tffd700{Te6edf3selected_interfaceTff7b72.Td2a8ffnameTffd700}Ta5d6ff with Tffd700{Tffa657lenTb4b4b4(Te6edf3app_dataTb4b4b4)Tffd700}Ta5d6ffB payloadTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdiscovery_destinationTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3app_dataTff7b72=Te6edf3app_dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while preparing interface discovery announces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ffsanitizeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3in_strTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3in_str Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Te6edf3sanitized Tff7b72= Te6edf3in_strTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sanitized Tff7b72= Te6edf3sanitizedTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sanitized Tff7b72= Te6edf3sanitizedTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3sanitized
Tff7b72def Td2a8ffget_interface_announce_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3interface_type Tff7b72= Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72.Td2a8ff__name__
Te6edf3stamp_value Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_stamp_value Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_stamp_value Tff7b72else Tff7b72selfTff7b72.Td2a8ffDEFAULT_STAMP_VALUE
Tff7b72if Tff7b72not Te6edf3interface_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_INTERFACE_TYPESTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffdiscovery_locationTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3discovery_location Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffdiscovery_locationTb4b4b4)
Te6edf3exec_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3discovery_locationTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3exec_pathTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3exec_pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEvaluating discovery location from executable at Tffd700{Te6edf3exec_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3exec_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Te6edf3exec_pathTb4b4b4]Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3exec_stdout Tff7b72= Te6edf3exec_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3exec_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNon-zero exit code from subprocessTa5d6ff"Tb4b4b4)
Te6edf3discovery_location Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3exec_stdoutTb4b4b4)
Te6edf3location_components Tff7b72= Te6edf3discovery_locationTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3location_componentsTb4b4b4) Tff7b72!= T79c0ff3Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid location component count: Tffd700{Tffa657lenTb4b4b4(Te6edf3location_componentsTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3dlat Tff7b72= Tffa657floatTb4b4b4(Te6edf3location_componentsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Te6edf3dlon Tff7b72= Tffa657floatTb4b4b4(Te6edf3location_componentsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3dhgt Tff7b72= Tffa657floatTb4b4b4(Te6edf3location_componentsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3dlat Tff7b72< Tff7b72-T79c0ff90 Tff7b72or Te6edf3dlat Tff7b72> T79c0ff90Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid latitude: Tffd700{Te6edf3dlatTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3dlon Tff7b72< Tff7b72-T79c0ff180 Tff7b72or Te6edf3dlat Tff7b72> T79c0ff180Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid longitude: Tffd700{Te6edf3dlonTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3dhgt Tff7b72< Tff7b72-T79c0ff4000 Tff7b72or Te6edf3dhgt Tff7b72> T79c0ff1e6Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid height: Tffd700{Te6edf3dhgtTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_latitude Tff7b72= Te6edf3dlat
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_longitude Tff7b72= Te6edf3dlon
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_height Tff7b72= Te6edf3dhgt
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while getting reachable_on from executable at Tffd700{Te6edf3interfaceTff7b72.Td2a8ffreachable_onTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Te6edf3flags Tff7b72= T79c0ff0x00
Te6edf3info Tff7b72= Tb4b4b4{Te6edf3INTERFACE_TYPETb4b4b4: Te6edf3interface_typeTb4b4b4,
Te6edf3TRANSPORTTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3TRANSPORT_IDTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3NAMETb4b4b4: Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffdiscovery_nameTb4b4b4)Tb4b4b4,
Te6edf3LATITUDETb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_latitudeTb4b4b4,
Te6edf3LONGITUDETb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_longitudeTb4b4b4,
Te6edf3HEIGHTTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffdiscovery_heightTb4b4b4}
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff" Tff7b72and Tff7b72not Te6edf3interfaceTff7b72.Td2a8ffkiss_framingTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid interface discovery configuration for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff, aborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72if Te6edf3interface_type Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3reachable_on Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffreachable_onTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3exec_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3reachable_onTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3exec_pathTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3exec_pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEvaluating reachable_on from executable at Tffd700{Te6edf3exec_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3exec_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Te6edf3exec_pathTb4b4b4]Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3exec_stdout Tff7b72= Te6edf3exec_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3exec_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNon-zero exit code from subprocessTa5d6ff"Tb4b4b4)
Te6edf3reachable_on Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3exec_stdoutTb4b4b4)
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3reachable_onTb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3reachable_onTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffValid IP address or hostname was not found in external script output Tffea00\"Tffd700{Te6edf3reachable_onTffd700}Tffea00\"Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while getting reachable_on from executable at Tffd700{Te6edf3interfaceTff7b72.Td2a8ffreachable_onTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3reachable_onTb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3reachable_onTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe configured reachable_on parameter Tffea00\"Tffd700{Te6edf3reachable_onTffd700}Tffea00\"Ta5d6ff for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff is not a valid IP address or hostnameTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAborting discovery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Te6edf3infoTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4] Tff7b72= Te6edf3reachable_on
Te6edf3infoTb4b4b4[Te6edf3PORTTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffbind_port
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff" Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffconnectable Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffb32Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffb32
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8fffrequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffbandwidth
Te6edf3infoTb4b4b4[Te6edf3SPREADINGFACTORTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffsf
Te6edf3infoTb4b4b4[Te6edf3CODINGRATETb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcr
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_frequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_bandwidth
Te6edf3infoTb4b4b4[Te6edf3CHANNELTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_channel
Te6edf3infoTb4b4b4[Te6edf3MODULATIONTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_modulation
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff" Tff7b72or Tb4b4b4(Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff" Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffkiss_framingTb4b4b4)Tb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3INTERFACE_TYPETb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"
Te6edf3infoTb4b4b4[Te6edf3FREQUENCYTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_frequency
Te6edf3infoTb4b4b4[Te6edf3BANDWIDTHTb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffdiscovery_bandwidth
Te6edf3infoTb4b4b4[Te6edf3MODULATIONTb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffdiscovery_modulationTb4b4b4)
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_publish_ifac Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3infoTb4b4b4[Te6edf3IFAC_NETNAMETb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netnameTb4b4b4)
Te6edf3infoTb4b4b4[Te6edf3IFAC_NETKEYTb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitizeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netkeyTb4b4b4)
Te6edf3packed Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)
Te6edf3infohash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72if Te6edf3infohash Tff7b72in Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4: Te6edf3stamp Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4[Te6edf3infohashTb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3stampTb4b4b4, Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffgenerate_stampTb4b4b4(Te6edf3infohashTb4b4b4, Te6edf3stamp_costTff7b72=Te6edf3stamp_valueTb4b4b4, Te6edf3expand_roundsTff7b72=Tff7b72selfTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDSTb4b4b4)
Tff7b72if Tff7b72not Te6edf3stampTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffstamp_cacheTb4b4b4[Te6edf3infohashTb4b4b4] Tff7b72= Te6edf3stamp
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffdiscovery_encryptTb4b4b4:
Te6edf3flags Tff7b72|Tff7b72= Te6edf3InterfaceAnnounceHandlerTff7b72.Td2a8ffFLAG_ENCRYPTED
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovery encryption requested for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff, but no network identity configured. Aborting discovery announce.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3payload Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3packedTff7b72+Te6edf3stampTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3payload Tff7b72= Te6edf3packedTff7b72+Te6edf3stamp
Tff7b72return Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3flagsTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3payload
Tff7b72class T56d364InterfaceAnnounceHandlerTb4b4b4:
Te6edf3FLAG_SIGNED Tff7b72= T79c0ff0b00000001
Te6edf3FLAG_ENCRYPTED Tff7b72= T79c0ff0b00000010
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3required_valueTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUETb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffLXMFTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72from T7ee787LXMF Tff7b72import Te6edf3LXStamper
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffUsing on-network interface discovery requires the LXMF module to be installed.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffYou can install it with the command: pip install lxmfTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaspect_filter Tff7b72= Te6edf3APP_NAMETff7b72+Ta5d6ff"Ta5d6ff.discovery.interfaceTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffrequired_value Tff7b72= Te6edf3required_value
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffstamper Tff7b72= Te6edf3LXStamper
Tff7b72selfTff7b72.Td2a8ffvalid_cache Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffvalid_cache_max Tff7b72= T79c0ff2048
Tff7b72selfTff7b72.Td2a8ffinvalid_cache Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=T79c0ff2048Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvalidation_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffsanitize_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3nameTb4b4b4: Tff7b72return Tff7b72None
Te6edf3name Tff7b72= Te6edf3nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffignoreTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tb4b4b4[T79c0ff5Tb4b4b4,T79c0ff3Tb4b4b4,T79c0ff2Tb4b4b4]Tb4b4b4: Te6edf3name Tff7b72= Te6edf3nameTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Te6edf3iTb4b4b4, Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3nameTb4b4b4) Tff7b72and Te6edf3nameTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72not Tff7b72in Te6edf3san_mapTb4b4b4: Te6edf3name Tff7b72= Te6edf3nameTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Tff7b72while Tffa657lenTb4b4b4(Te6edf3nameTb4b4b4) Tff7b72and Te6edf3nameTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72not Tff7b72in Te6edf3san_mapTff7b72+Ta5d6ff"Ta5d6ff)Ta5d6ff"Tb4b4b4: Te6edf3name Tff7b72= Te6edf3nameTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72return Te6edf3name
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3discovery_sources Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffinterface_discovery_sourcesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3discovery_sources Tff7b72and Tff7b72not Te6edf3announced_identityTff7b72.Td2a8ffhash Tff7b72in Te6edf3discovery_sourcesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInterface discovered from non-authorized network identity Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3announced_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff, ignoringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3app_data Tff7b72and Tffa657lenTb4b4b4(Te6edf3app_dataTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETff7b72+T79c0ff1Tb4b4b4:
Te6edf3flags Tff7b72= Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3app_data Tff7b72= Te6edf3app_dataTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]
Te6edf3signed Tff7b72= Te6edf3flags Tff7b72& Tff7b72selfTff7b72.Td2a8ffFLAG_SIGNED
Te6edf3encrypted Tff7b72= Te6edf3flags Tff7b72& Tff7b72selfTff7b72.Td2a8ffFLAG_ENCRYPTED
Te6edf3fullhash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Te6edf3fullhash Tff7b72in Tff7b72selfTff7b72.Td2a8ffinvalid_cacheTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIgnored previously discovered interface with insufficient stamp valueTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return
Tff7b72if Te6edf3fullhash Tff7b72in Tff7b72selfTff7b72.Td2a8ffvalid_cacheTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovery announce cache hitTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_PATHINGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3cache_entry Tff7b72= Tff7b72selfTff7b72.Td2a8ffvalid_cacheTb4b4b4[Te6edf3fullhashTb4b4b4]
Te6edf3stamp Tff7b72= Te6edf3cache_entryTb4b4b4[Ta5d6ff"Ta5d6ffstampTa5d6ff"Tb4b4b4]
Te6edf3packed Tff7b72= Te6edf3cache_entryTb4b4b4[Ta5d6ff"Ta5d6ffpackedTa5d6ff"Tb4b4b4]
Te6edf3value Tff7b72= Te6edf3cache_entryTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]
Te6edf3valid Tff7b72= Te6edf3cache_entryTb4b4b4[Ta5d6ff"Ta5d6ffvalidTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3encryptedTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_network_identityTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3app_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Tff7b72not Te6edf3app_dataTb4b4b4: Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8ffvalidation_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropping received interface discovery announce, already validating other discovery stampTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return
Tff7b72with Tff7b72selfTff7b72.Td2a8ffvalidation_lockTb4b4b4:
Te6edf3stamp Tff7b72= Te6edf3app_dataTb4b4b4[Tff7b72-Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETb4b4b4:Tb4b4b4]
Te6edf3packed Tff7b72= Te6edf3app_dataTb4b4b4[Tb4b4b4:Tff7b72-Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffSTAMP_SIZETb4b4b4]
Te6edf3infohash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3packedTb4b4b4)
Te6edf3workblock Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_workblockTb4b4b4(Te6edf3infohashTb4b4b4, Te6edf3expand_roundsTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDSTb4b4b4)
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_valueTb4b4b4(Te6edf3workblockTb4b4b4, Te6edf3stampTb4b4b4)
Te6edf3valid Tff7b72= Tff7b72selfTff7b72.Td2a8ffstamperTff7b72.Td2a8ffstamp_validTb4b4b4(Te6edf3stampTb4b4b4, Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4, Te6edf3workblockTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvalid_cacheTb4b4b4[Te6edf3fullhashTb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffvalidTa5d6ff"Tb4b4b4: Te6edf3validTb4b4b4, Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4: Te6edf3valueTb4b4b4, Ta5d6ff"Ta5d6ffpackedTa5d6ff"Tb4b4b4: Te6edf3packedTb4b4b4, Ta5d6ff"Ta5d6ffstampTa5d6ff"Tb4b4b4: Te6edf3stampTb4b4b4}
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffvalid_cacheTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffvalid_cache_maxTb4b4b4: Tff7b72selfTff7b72.Td2a8ffvalid_cacheTff7b72.Td2a8ffpopTb4b4b4(Tffa657nextTb4b4b4(Tffa657iterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffvalid_cacheTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3validTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIgnored discovered interface with insufficient stamp value Tffd700{Te6edf3valueTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinvalid_cacheTff7b72.Td2a8ffappendTb4b4b4(Te6edf3fullhashTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3value Tff7b72< Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIgnored discovered interface with stamp value Tffd700{Te6edf3valueTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3info Tff7b72= Tff7b72None
Te6edf3unpacked Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72if Te6edf3INTERFACE_TYPE Tff7b72in Te6edf3unpackedTb4b4b4:
Te6edf3interface_type Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3INTERFACE_TYPETb4b4b4]
Te6edf3name Tff7b72= Tff7b72selfTff7b72.Td2a8ffsanitize_nameTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3NAMETb4b4b4]Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORTTb4b4b4]Tb4b4b4) Tff7b72!= Tffa657boolTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in transport field of announceTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3LATITUDETb4b4b4]Tb4b4b4) Tff7b72not Tff7b72in Tb4b4b4[Tffa657typeTb4b4b4(Tff7b72NoneTb4b4b4)Tb4b4b4, Tffa657floatTb4b4b4]Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in latitude field of announceTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3LONGITUDETb4b4b4]Tb4b4b4) Tff7b72not Tff7b72in Tb4b4b4[Tffa657typeTb4b4b4(Tff7b72NoneTb4b4b4)Tb4b4b4, Tffa657floatTb4b4b4]Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in longitude field of announceTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3HEIGHTTb4b4b4]Tb4b4b4) Tff7b72not Tff7b72in Tb4b4b4[Tffa657typeTb4b4b4(Tff7b72NoneTb4b4b4)Tb4b4b4, Tffa657floatTb4b4b4]Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in height field of announceTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORT_IDTb4b4b4]Tb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in transport_id field of announceTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3interface_type Tff7b72in Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDISCOVERABLE_INTERFACE_TYPESTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid interface type in announce dataTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3REACHABLE_ON Tff7b72in Te6edf3unpackedTb4b4b4:
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]Tb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in reachable_on field of announceTa5d6ff"Tb4b4b4)
Te6edf3info Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3interface_typeTb4b4b4,
Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORTTb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3name Tff7b72or Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4: Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstampTa5d6ff"Tb4b4b4: Te6edf3stampTb4b4b4,
Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4: Te6edf3valueTb4b4b4,
Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3TRANSPORT_IDTb4b4b4]Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3announced_identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflatitudeTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3LATITUDETb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fflongitudeTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3LONGITUDETb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffheightTa5d6ff"Tb4b4b4: Te6edf3unpackedTb4b4b4[Te6edf3HEIGHTTb4b4b4]Tb4b4b4}
Tff7b72if Te6edf3IFAC_NETNAME Tff7b72in Te6edf3unpackedTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3IFAC_NETNAMETb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3IFAC_NETKEY Tff7b72in Te6edf3unpackedTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3unpackedTb4b4b4[Te6edf3IFAC_NETKEYTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3interface_type Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3backbone_support Tff7b72= Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3PORTTb4b4b4]
Te6edf3connection_interface Tff7b72= Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff" Tff7b72if Te6edf3backbone_support Tff7b72else Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"
Te6edf3remote_str Tff7b72= Ta5d6ff"Ta5d6ffremoteTa5d6ff" Tff7b72if Te6edf3backbone_support Tff7b72else Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_remote Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3cfg_port Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = Tffd700{Te6edf3connection_interfaceTffd700}Tffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff Tffd700{Te6edf3remote_strTffd700}Ta5d6ff = Tffd700{Te6edf3cfg_remoteTffd700}Tffea00\nTa5d6ff target_port = Tffd700{Te6edf3cfg_portTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3REACHABLE_ONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_remote Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = I2PInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff peers = Tffd700{Te6edf3cfg_remoteTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffsfTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3SPREADINGFACTORTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffcrTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3CODINGRATETb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_frequency Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4]
Te6edf3cfg_bandwidth Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4]
Te6edf3cfg_sf Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffsfTa5d6ff"Tb4b4b4]
Te6edf3cfg_cr Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffcrTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = RNodeInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffea00\nTa5d6ff frequency = Tffd700{Te6edf3cfg_frequencyTffd700}Tffea00\nTa5d6ff bandwidth = Tffd700{Te6edf3cfg_bandwidthTffd700}Tffea00\nTa5d6ff spreadingfactor = Tffd700{Te6edf3cfg_sfTffd700}Tffea00\nTa5d6ff codingrate = Tffd700{Te6edf3cfg_crTffd700}Tffea00\nTa5d6ff txpower = Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffchannelTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3CHANNELTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3MODULATIONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = WeaveInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FREQUENCYTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3BANDWIDTHTb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3MODULATIONTb4b4b4]
Te6edf3cfg_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3cfg_frequency Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffrequencyTa5d6ff"Tb4b4b4]
Te6edf3cfg_bandwidth Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffbandwidthTa5d6ff"Tb4b4b4]
Te6edf3cfg_modulation Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffmodulationTa5d6ff"Tb4b4b4]
Te6edf3cfg_identity Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]
Te6edf3cfg_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3cfg_netname_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff network_name = Tffd700{Te6edf3cfg_netnameTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netname Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_netkey_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff passphrase = Tffd700{Te6edf3cfg_netkeyTffd700}Ta5d6ff" Tff7b72if Te6edf3cfg_netkey Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3cfg_identity_str Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff transport_identity = Tffd700{Te6edf3cfg_identityTffd700}Ta5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[[Tffd700{Te6edf3cfg_nameTffd700}Ta5d6ff]]Tffea00\nTa5d6ff type = KISSInterfaceTffea00\nTa5d6ff enabled = yesTffea00\nTa5d6ff port = Tffea00\nTa5d6ff # Frequency: Tffd700{Te6edf3cfg_frequencyTffd700}Tffea00\nTa5d6ff # Bandwidth: Tffd700{Te6edf3cfg_bandwidthTffd700}Tffea00\nTa5d6ff # Modulation: Tffd700{Te6edf3cfg_modulationTffd700}Tffd700{Te6edf3cfg_identity_strTffd700}Tffd700{Te6edf3cfg_netname_strTffd700}Tffd700{Te6edf3cfg_netkey_strTffd700}Ta5d6ff"
Te6edf3discovery_hash_material Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4]Tff7b72+Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3discovery_hash_materialTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while trying to decode discovered interface. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72class T56d364InterfaceDiscoveryTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3THRESHOLD_UNKNOWN Tff7b72= T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3THRESHOLD_STALE Tff7b72= T79c0ff3Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3THRESHOLD_REMOVE Tff7b72= T79c0ff7Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3MONITOR_INTERVAL Tff7b72= T79c0ff5
Te6edf3DETACH_THRESHOLD Tff7b72= T79c0ff12
Te6edf3STATUS_STALE Tff7b72= T79c0ff0
Te6edf3STATUS_UNKNOWN Tff7b72= T79c0ff100
Te6edf3STATUS_AVAILABLE Tff7b72= T79c0ff1000
Te6edf3STATUS_CODE_MAP Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffavailableTa5d6ff"Tb4b4b4: Te6edf3STATUS_AVAILABLETb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4: Te6edf3STATUS_UNKNOWNTb4b4b4, Ta5d6ff"Ta5d6ffstaleTa5d6ff"Tb4b4b4: Te6edf3STATUS_STALETb4b4b4}
Te6edf3AUTOCONNECT_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4]
Te6edf3DISCOVERABLE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4]
Te6edf3discovery_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3required_valueTff7b72=Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUETb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3discover_interfacesTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3required_valueTb4b4b4: Te6edf3required_value Tff7b72= Te6edf3InterfaceAnnouncerTff7b72.Td2a8ffDEFAULT_STAMP_VALUE
Tff7b72selfTff7b72.Td2a8ffrequired_value Tff7b72= Te6edf3required_value
Tff7b72selfTff7b72.Td2a8ffdiscovery_callback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffrns_instance Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmonitored_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnects Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmonitor_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffMONITOR_INTERVAL
Tff7b72selfTff7b72.Td2a8ffdetach_threshold Tff7b72= Tff7b72selfTff7b72.Td2a8ffDETACH_THRESHOLD
Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffrns_instanceTb4b4b4: Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to start interface discovery listener without an active RNS instanceTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffdiscoveryTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72if Te6edf3discover_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhandler Tff7b72= Te6edf3InterfaceAnnounceHandlerTb4b4b4(Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffinterface_discoveredTb4b4b4, Te6edf3required_valueTff7b72=Tff7b72selfTff7b72.Td2a8ffrequired_valueTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffconnect_discoveredTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflist_discovered_interfacesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3only_availableTff7b72=Tff7b72FalseTb4b4b4, Te6edf3only_transportTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3discovered_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3discovery_sources Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffinterface_discovery_sourcesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffdiscovery_lockTb4b4b4:
Te6edf3filepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3info Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3should_remove Tff7b72= Tff7b72False
Te6edf3heard_delta Tff7b72= Te6edf3nowTff7b72-Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3InterfaceAnnounceHandlerTff7b72.Td2a8ffsanitize_nameTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_REMOVETb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Te6edf3discovery_sources Tff7b72and Tff7b72not Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Te6edf3discovery_sources Tff7b72and Tff7b72not Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72in Te6edf3discovery_sourcesTb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Tff7b72not Ta5d6ff"Ta5d6fftypeTa5d6ff" Tff7b72in Te6edf3info Tff7b72or Tb4b4b4(Ta5d6ff"Ta5d6fftypeTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tff7b72not Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_TYPESTb4b4b4)Tb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72elif Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4:
Tff7b72if Tff7b72not Tb4b4b4(Te6edf3is_ip_addressTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72or Te6edf3is_hostnameTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4: Te6edf3should_remove Tff7b72= Tff7b72True
Tff7b72if Te6edf3should_removeTb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filepathTb4b4b4)
Tff7b72continue
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_STALETb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffstaleTa5d6ff"
Tff7b72elif Te6edf3heard_delta Tff7b72> Tff7b72selfTff7b72.Td2a8ffTHRESHOLD_UNKNOWNTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffavailableTa5d6ff"
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatus_codeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATUS_CODE_MAPTb4b4b4[Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3only_available Tff7b72and Tff7b72not Te6edf3only_transportTb4b4b4: Te6edf3discovered_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3should_append Tff7b72= Tff7b72True
Te6edf3status Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4]
Te6edf3transport Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3only_available Tff7b72and Te6edf3status Tff7b72!= Ta5d6ff"Ta5d6ffavailableTa5d6ff"Tb4b4b4: Te6edf3should_append Tff7b72= Tff7b72False
Tff7b72if Te6edf3only_transport Tff7b72and Tff7b72not Te6edf3transportTb4b4b4: Te6edf3should_append Tff7b72= Tff7b72False
Tff7b72if Te6edf3should_appendTb4b4b4: Te6edf3discovered_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while loading discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe interface data file Tffd700{Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)Tffd700}Ta5d6ff may be corruptTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3discovered_interfacesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3infoTb4b4b4: Tb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffstatus_codeTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Te6edf3discovered_interfaces
Tff7b72def Td2a8ffinterface_discoveredTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3value Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]
Te6edf3interface_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Te6edf3discovery_hash Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_hashTa5d6ff"Tb4b4b4]
Te6edf3discovered_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3discovered_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffDISCOVERABLE_TYPESTb4b4b4: Tff7b72return
Te6edf3hops Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3hops Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3filename Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3discovery_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3filepath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff Tffd700{Te6edf3hopsTffd700}Ta5d6ff hopTffd700{Te6edf3msTffd700}Ta5d6ff away with stamp value Tffd700{Te6edf3valueTffd700}Ta5d6ff: Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ffdiscovery_lockTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3filepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return
Tff7b72elseTb4b4b4:
Te6edf3discovered Tff7b72= Tff7b72None
Te6edf3heard_count Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3last_info Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3discovered Tff7b72= Te6edf3last_infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4]
Te6edf3heard_count Tff7b72= Te6edf3last_infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4]
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while reading existing data for discovered interface, re-creating dataTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3discovered Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3discovered Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3heard_count Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3heard_count Tff7b72= T79c0ff0
Tff7b72with Tffa657openTb4b4b4(Te6edf3filepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiscoveredTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3discovered
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4]
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffheard_countTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3heard_countTff7b72+T79c0ff1
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError processing discovered interface data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return
Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdiscovery_callback Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdiscovery_callbackTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdiscovery_callbackTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while processing external interface discovery callback: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffmonitor_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnectsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnects Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__monitor_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__monitor_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffmonitoring_autoconnects Tff7b72and Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ff_should_runTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmonitor_intervalTb4b4b4)
Te6edf3detached_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3online_interfaces Tff7b72= T79c0ff0
Te6edf3autoconnected_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3online_interfaces Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_downTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff reconnectedTa5d6ff"Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_downTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff disconnectedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3down_for Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3interfaceTff7b72.Td2a8ffautoconnect_down
Tff7b72if Te6edf3down_for Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffdetach_thresholdTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-discovered interface Tffd700{Te6edf3interfaceTffd700}Ta5d6ff has been down for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3down_forTb4b4b4)Tffd700}Ta5d6ff, detachingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3detached_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while checking auto-connected interface state for Tffd700{Te6edf3interfaceTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3max_autoconnected_interfaces Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)
Te6edf3free_slots Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3max_autoconnected_interfaces Tff7b72- Te6edf3autoconnected_interfacesTb4b4b4)
Te6edf3reserved_slots Tff7b72= Te6edf3max_autoconnected_interfacesTff7b72/Tff7b72/T79c0ff4
Tff7b72if Te6edf3online_interfaces Tff7b72>Tff7b72= Te6edf3max_autoconnected_interfacesTb4b4b4:
Tff7b72for Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffbootstrap_only Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTearing down bootstrap-only Tffd700{Te6edf3interfaceTffd700}Ta5d6ff since target connected auto-discovered interface count has been reachedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72if Tff7b72not Te6edf3interface Tff7b72in Te6edf3detached_interfacesTb4b4b4: Te6edf3detached_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72if Te6edf3online_interfaces Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbootstrap_interface_countTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo auto-discovered interfaces connected, re-enabling bootstrap interfacesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72for Te6edf3config Tff7b72in Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffbootstrap_configsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_synthesize_interfaceTb4b4b4(Te6edf3configTb4b4b4, Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72and Te6edf3free_slots Tff7b72> Te6edf3reserved_slotsTb4b4b4:
Te6edf3candidate_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_discovered_interfacesTb4b4b4(Te6edf3only_availableTff7b72=Tff7b72TrueTb4b4b4, Te6edf3only_transportTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3candidate_interfacesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3randomTff7b72.Td2a8ffshuffleTb4b4b4(Te6edf3candidate_interfacesTb4b4b4)
Te6edf3selected_interface Tff7b72= Te6edf3candidate_interfacesTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinterface_existsTb4b4b4(Te6edf3selected_interfaceTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3selected_interfaceTb4b4b4)
Tff7b72for Te6edf3interface Tff7b72in Te6edf3detached_interfacesTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffteardown_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while de-registering auto-connected interface from transport: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffteardown_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffremove_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72if Te6edf3interface Tff7b72in Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmonitored_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72def Td2a8ffautoconnect_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfaces Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3iTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_hashTa5d6ff"Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffbootstrap_interface_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tb4b4b4[Te6edf3i Tff7b72for Te6edf3i Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfaces Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3iTb4b4b4, Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3iTff7b72.Td2a8ffbootstrap_only Tff7b72== Tff7b72TrueTb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffconnect_discoveredTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffshould_autoconnect_discovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3discovered_interfaces Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_discovered_interfacesTb4b4b4(Te6edf3only_transportTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72for Te6edf3info Tff7b72in Te6edf3discovered_interfacesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72break
Tff7b72selfTff7b72.Td2a8ffautoconnectTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinitial_autoconnect_ran Tff7b72= Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while reconnecting discovered interfaces: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffendpoint_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3endpoint_specifier Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3endpoint_specifier Tff7b72+Tff7b72= Tffa657strTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3infoTb4b4b4: Te6edf3endpoint_specifier Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3endpoint_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3endpoint_specifierTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3endpoint_hash
Tff7b72def Td2a8ffinterface_existsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3exists Tff7b72= Tff7b72False
Tff7b72for Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_hashTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffautoconnect_hash Tff7b72== Tff7b72selfTff7b72.Td2a8ffendpoint_hashTb4b4b4(Te6edf3infoTb4b4b4)Tb4b4b4:
Te6edf3exists Tff7b72= Tff7b72True
Tff7b72break
Tff7b72elseTb4b4b4:
Te6edf3dest_match Tff7b72= Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6fftarget_ipTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8fftarget_ip Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3port_match Tff7b72= Tff7b72not Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3info Tff7b72or Tb4b4b4(Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4) Tff7b72and Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Te6edf3interfaceTff7b72.Td2a8fftarget_port Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3b32d_match Tff7b72= Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3info Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffb32Ta5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffb32 Tff7b72== Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Tff7b72if Tb4b4b4(Te6edf3dest_match Tff7b72and Te6edf3port_matchTb4b4b4) Tff7b72or Te6edf3b32d_matchTb4b4b4:
Te6edf3exists Tff7b72= Tff7b72True
Tff7b72break
Tff7b72return Te6edf3exists
Tff7b72def Td2a8ffautoconnectTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3infoTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffshould_autoconnect_discovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3autoconnected_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffautoconnect_countTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3autoconnected_count Tff7b72< Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3interface_type Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3interface_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffAUTOCONNECT_TYPESTb4b4b4:
Te6edf3endpoint_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffendpoint_hashTb4b4b4(Te6edf3infoTb4b4b4)
Te6edf3exists Tff7b72= Tff7b72selfTff7b72.Td2a8ffinterface_existsTb4b4b4(Te6edf3infoTb4b4b4)
Tff7b72if Te6edf3existsTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff already exists, not auto-connectingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYour operating system does not support the Backbone interface type, and must degrade to using TCPClientInterface insteadTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered TCPClient interfaces is not yet implemented, aborting auto-connectTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYou can obtain the configuration entry and add this interface manually instead using rnstatus -DTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered I2P interfaces is not yet implemented, aborting auto-connectTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYou can obtain the configuration entry and add this interface manually instead using rnstatus -DTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3is_ygg_ipv6Tb4b4b4(Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4:
T8b949e# TODO: Somehow detect if yggdrasil is enabled on the system
Tff7b72return
Te6edf3interface_name Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3config_entry Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffconfig_entryTa5d6ff"Tb4b4b4]
Te6edf3interface_config Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3interface_nameTffd700}Ta5d6ff"
Te6edf3ifac_netname Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3ifac_netkey Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff" Tff7b72in Te6edf3info Tff7b72else Tff7b72None
Te6edf3interface Tff7b72= Tff7b72None
Tff7b72if Te6edf3interface_type Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787Interfaces Tff7b72import Te6edf3BackboneInterface
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Te6edf3interface Tff7b72= Te6edf3BackboneInterfaceTff7b72.Td2a8ffBackboneClientInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Tff7b72if Te6edf3interfaceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuto-connecting discovered Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff Tffd700{Te6edf3interface_nameTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_hash Tff7b72= Te6edf3endpoint_hash
Te6edf3interfaceTff7b72.Td2a8ffautoconnect_source Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4]
Te6edf3mode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAY Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72None
Te6edf3ar_target Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ar_targetTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72None
Te6edf3ar_penalty Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ar_penaltyTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72None
Te6edf3ar_grace Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_default_ar_graceTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_add_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4, Te6edf3modeTff7b72=Te6edf3modeTb4b4b4, Te6edf3ifac_netnameTff7b72=Te6edf3ifac_netnameTb4b4b4, Te6edf3ifac_netkeyTff7b72=Te6edf3ifac_netkeyTb4b4b4, Te6edf3configured_bitrateTff7b72=T79c0ff5E6Tb4b4b4,
Te6edf3announce_rate_targetTff7b72=Te6edf3ar_targetTb4b4b4, Te6edf3announce_rate_graceTff7b72=Te6edf3ar_graceTb4b4b4, Te6edf3announce_rate_penaltyTff7b72=Te6edf3ar_penaltyTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmonitor_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while auto-connecting discovered interface: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72class T56d364BlackholeUpdaterTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3INITIAL_WAIT Tff7b72= T79c0ff20
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff60
Te6edf3UPDATE_INTERVAL Tff7b72= T79c0ff1Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3SOURCE_TIMEOUT Tff7b72= T79c0ff25
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflast_updates Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= Tff7b72selfTff7b72.Td2a8ffJOB_INTERVAL
Tff7b72selfTff7b72.Td2a8ffupdate_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3source_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3source_count Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStarting blackhole updater with Tffd700{Te6edf3source_countTffd700}Ta5d6ff sourceTffd700{Te6edf3msTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72def Td2a8ffupdate_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3remote_identity Tff7b72= Te6edf3linkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLink established for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3receipt Tff7b72= Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6ff/listTa5d6ff"Tb4b4b4)
Tff7b72while Tff7b72not Te6edf3receiptTff7b72.Td2a8ffconcludedTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3receiptTff7b72.Td2a8ffget_responseTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3responseTb4b4b4) Tff7b72== Tffa657dictTb4b4b4: Te6edf3blackhole_list Tff7b72= Te6edf3response
Tff7b72elseTb4b4b4: Te6edf3blackhole_list Tff7b72= Tff7b72None
Tff7b72if Te6edf3blackhole_listTb4b4b4:
Te6edf3added Tff7b72= T79c0ff0
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3blackhole_listTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3blackhole_listTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72if Tff7b72not Te6edf3identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identitiesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3entry
Te6edf3added Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3added Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3spec Tff7b72= Ta5d6ff"Ta5d6ffidentityTa5d6ff" Tff7b72if Te6edf3added Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAdded Tffd700{Te6edf3addedTffd700}Ta5d6ff blackholed Tffd700{Te6edf3specTffd700}Ta5d6ff from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3sourcelistpath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackholepathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3tmppath Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3sourcelistpathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmppathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3blackhole_listTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3sourcelistpathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3sourcelistpathTb4b4b4)
Te6edf3osTff7b72.Td2a8ffrenameTb4b4b4(Te6edf3tmppathTb4b4b4, Te6edf3sourcelistpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while persisting blackhole list from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBlackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff completedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffINITIAL_WAITTb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4: Te6edf3last_update Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3last_update Tff7b72= T79c0ff0
Tff7b72if Te6edf3now Tff7b72> Te6edf3last_updateTff7b72+Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffblackhole_update_intervalTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6ffrnstransport.info.blackholeTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAttempting blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffawait_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo path available for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff, retrying laterTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3remote_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6ffrnstransportTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffblackholeTa5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3established_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffupdate_link_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_updatesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while establishing link for blackhole list update from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError in blackhole list updater job: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)
Tff7b72def Td2a8ffis_ip_addressTb4b4b4(Te6edf3address_stringTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Te6edf3address_stringTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72False
Tff7b72def Td2a8ffis_ygg_ipv6Tb4b4b4(Te6edf3address_stringTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72return Te6edf3ipaddressTff7b72.Td2a8ffip_addressTb4b4b4(Te6edf3address_stringTb4b4b4) Tff7b72in Te6edf3ipaddressTff7b72.Td2a8ffIPv6NetworkTb4b4b4(Ta5d6ff"Ta5d6ff200::/7Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72False
Tff7b72def Td2a8ffis_hostnameTb4b4b4(Te6edf3hostnameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3hostnameTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4: Te6edf3hostname Tff7b72= Te6edf3hostnameTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hostnameTb4b4b4) Tff7b72> T79c0ff253Tb4b4b4: Tff7b72return Tff7b72False
Te6edf3components Tff7b72= Te6edf3hostnameTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff[0-9]+$Ta5d6ff"Tb4b4b4, Te6edf3componentsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4: Tff7b72return Tff7b72False
Te6edf3allowed Tff7b72= Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff(?!-)[a-z0-9-]Ta5d6ff{Ta5d6ff1,63}(?<!-)$Ta5d6ff"Tb4b4b4, Te6edf3reTff7b72.Td2a8ffIGNORECASETb4b4b4)
Tff7b72return Tffa657allTb4b4b4(Te6edf3allowedTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3labelTb4b4b4) Tff7b72for Te6edf3label Tff7b72in Te6edf3componentsTb4b4b4)
Te6edf3san_map Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff48Tb4b4b4, T79c0ff58Tb4b4b4)Tb4b4b4: Te6edf3san_map Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff65Tb4b4b4, T79c0ff91Tb4b4b4)Tb4b4b4: Te6edf3san_map Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff97Tb4b4b4, T79c0ff123Tb4b4b4)Tb4b4b4: Te6edf3san_map Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────